MCP의 리소스를 사용하면 데이터를 가져오기 위해 도구 호출을 요구하는 대신, 프롬프트에 직접 포함할 수 있는 정보를 서버가 노출할 수 있습니다. 이를 통해 AI 모델에 컨텍스트를 더 효율적으로 제공할 수 있습니다.
위 다이어그램은 리소스가 어떻게 작동하는지 보여줍니다. 사용자가 "@" 뒤에 무언가를 입력하면 우리 코드는 이를 리소스 요청으로 인식하고, MCP 서버에 ReadResourceRequest를 보낸 뒤 실제 콘텐츠가 담긴 ReadResourceResult를 돌려받습니다.
리소스 읽기 구현하기
MCP 클라이언트에서 리소스 접근을 활성화하려면 read_resource 함수를 구현해야 합니다. 먼저 필요한 import를 추가합니다.
import json
from pydantic import AnyUrl
핵심 함수는 MCP 서버에 요청을 보내고 MIME type에 따라 응답을 처리합니다.
async def read_resource(self, uri: str) -> Any:
result = await self.session().read_resource(AnyUrl(uri))
resource = result.contents[0]
if isinstance(resource, types.TextResourceContents):
if resource.mimeType == "application/json":
return json.loads(resource.text)
return resource.text
응답 구조 이해하기
리소스를 요청하면 서버는 contents 리스트를 포함한 결과를 반환합니다. 일반적으로 한 번에 하나의 리소스만 필요하므로 첫 번째 요소에 접근합니다. 응답에는 다음이 포함됩니다.
- 실제 콘텐츠(텍스트 또는 데이터)
- 콘텐츠를 어떻게 파싱할지 알려 주는 MIME type
- 리소스에 대한 기타 메타데이터
콘텐츠 타입 처리
이 함수는 MIME type을 확인해 콘텐츠를 어떻게 처리할지 결정합니다.
application/json이면 텍스트를 JSON으로 파싱해 파싱된 객체를 반환합니다
- 그 외에는 원시 텍스트 콘텐츠를 반환합니다
이 접근 방식은 JSON 같은 구조화된 데이터와 일반 텍스트 문서를 모두 자연스럽게 처리합니다.
리소스 접근 테스트하기
구현이 끝나면 CLI 애플리케이션을 통해 리소스 기능을 테스트할 수 있습니다. "@" 뒤에 리소스 이름을 입력하면 시스템은 다음을 수행합니다.
- 자동완성 목록에 사용 가능한 리소스를 표시합니다
- 화살표 키와 스페이스 키로 리소스를 선택할 수 있게 합니다
- 리소스 콘텐츠를 프롬프트에 직접 포함합니다
- 추가 도구 호출 없이 모든 내용을 AI 모델에 보냅니다
이 방식은 AI 모델이 문서 내용을 가져오기 위해 별도의 도구 호출을 수행하는 방식보다 훨씬 더 매끄러운 사용자 경험을 제공합니다. 리소스 콘텐츠가 초기 컨텍스트의 일부가 되므로 데이터에 대해 즉시 응답할 수 있습니다.